/** 轮询工具-重复查某个接口，判断返回状态值：未获取到理想的状态值返回'goon'，获取到则返回'done'
 * @param {Object} param
 * @param {Number} [param.max = 10] 最大轮询次数
 * @param {Function} param.runCallback 运行时回调
 * @param {Function} [param.timeOutCallback = () => {}] 超时回调
 * @param {Number} [param.speed = 1000] 轮询速度
 */
export async function polling({ max = 10, runCallback, timeOutCallback = () => {}, speed = 1000 }) {
	let state
	for (var i = 0; i < max; i++) {
		const res = await runCallback()
		switch (res) {
			case false:
				state = 'done' // 完成状态
				break
			case true:
				state = 'goon' // 继续状态
				break
			default:
				state = res // 自定义状态
		}
		if (state !== 'goon') return state
		await new Promise((resolve) =>
			setTimeout(() => {
				resolve()
			}, speed)
		)
	}
	await timeOutCallback()
	return 'timeout' // 超时状态
}

/** 函数节流
 * @param {Function} fn 需要节流的方法
 * @param {Time} interval 毫秒
 * @returns {Function}
 */
export function throttle(fn, interval = 300) {
	let canRun = true
	return function () {
		if (!canRun) return
		canRun = false
		setTimeout(() => {
			fn.apply(this, arguments)
			canRun = true
		}, interval)
	}
}

/** 函数防抖
 * @param {Function} fn 需要防抖的方法
 * @param {Time} interval 毫秒
 * @returns {Function}
 */
export function debounce(fn, interval = 300) {
	let timer
	return function (...args) {
		if (timer) {
			clearTimeout(timer)
		}
		timer = setTimeout(() => {
			fn.apply(this, args)
		}, interval)
	}
}

/** 处理成仅数字&最大值
 * @param {String} String 需要处理的数据
 * @param {Number} Number 可返回的数字最大值
 */
export const onlyNumberMax = (v, max = 99999999) => {
	if (!v) return ''
	const dealV = +v.replace(/\D/g, '') // 去掉非数字&首位0
	const realV = !dealV ? '' : dealV // 不能为 0
	return realV ? Math.min(max, realV) : ''
}
